#ifndef __GAF_APP_H__
#define __GAF_APP_H__

namespace GAF
{
	class Application;
}
typedef GAF::Application		GAF_CApplication;

#include "GAF_Define.h"
#include "GAF_Platform.h"
#include "GAF_Command.h"
#include "GAF_Window.h"

/// 唯一应用程序运行实例指针
#define	GAF_pTHEAPP			GAF_CApplication::ThePApp
/// 当前使用平台指针 
#define GAF_pTHEPLATFORM		GAF_pTHEAPP->GetUsePlatform()
/// 当前使用窗口
#define	GAF_pTHEWINDOW			GAF_pTHEAPP->GetMainWindow()

namespace GAF
{
	/**
 	 *  @addtogroup Frame
	 *  @{
	 */

	/// 应用程序基类
	class _ABSTRACT Application
	{
		friend class Window; // 用于可调用更新计时器

	public:
		/// 唯一应用程序运行实例指针
		static Application*	ThePApp;
		/// 清除所有资源
		static void		DeleteAllResource();
		/// 清除所有内存
		static void		DeleteAllMemory();

	public:
		Application();
		virtual ~Application();

	public:
		/// 初始化应用程序
		/**
		 *  @returns
		 *	返回是否初始化程序成功。
		 */
		bool			InitApp();

		/// 运行应用程序
		/**
		 *  @returns
		 *	返回程序运行结束的返回值。
		 */
		int			RunApp();

		/// 运行应用程序之前，用于使用外部程序轮回机制
		bool			PreRunApp();
		/// 运行应用程序之后，用于使用外部程序轮回机制
		int			EndRunApp();

		/// 更新应用程序
		void			UpdateApp();

		/// 退出应用程序
		/**
		 *  @param 
		 *	isEnforce 是否强行退出。默认为否(false)。
		 *  @returns
		 *	返回是否允许程序退出。
		 */
		void			QuitApp(bool isEnforce = false);

		/// 卸载应用程序
		void			DestroyApp();

	public:
		/// 获得程序运行的窗口指针
		Window*			GetMainWindow();
		/// 获得程序运行的主场景指针
		Scene*			GetMainScene();
		/// 程序时候已推出
		bool			IsQuit();

	public:
		/// 创建应用程序默认资源包
		virtual Package*	CreateDefaultPackage(_OUT STD_STRING& strPackageKind)
					{return NULL;}
		/// 删除默认资源包
		virtual void		DeleteDefaultPackage(STD_STRING& strPackageKind, GAF_CPackage* ppkgDelete)
					{}
		/// 处理窗口替换出来的场景
		virtual void		TurnOffScene(GAF_CScene* pScene)
					{}

	public:
		/// 获得图像引擎平台
		/**
		 *	纯虚函数。
		 *  @returns
		 *	返回图像引擎平台指针。
		 */
		virtual GAF_CPlatform*	GetUsePlatform() = 0;

	protected:
		/// 当创建程序时引发的事件
		/**
		 *	纯虚函数。
		 *  @returns
		 *	返回初始化是否成功。
		 */
		virtual GAF_CScene*	OnCreateApp(_OUT GAF_SCreateWindow& cw) = 0;

		/// 当初始化程序时引发的事件
		/**
		 *	纯虚函数。
		 *  @returns
		 *	返回初始化是否成功。
		 */
		virtual bool		OnInitApp() = 0;

		/// 当开始程序时引发的事件
		/**
		 *	虚函数。
		 *  @returns
		 *	返回是否运行程序。
		 */
		virtual bool		OnStartApp()
					{return true;}

		/// 当获得系统命令时引发的事件
		/**
		 *	虚函数。
		 */
		virtual bool		OnGetCommand(Command& cmd)
					{return true;}

		/// 当更新应用程序时引发的事件
		/**
		 *	虚函数。
		 */
		virtual void		OnUpdateApp()
					{return;}

		/// 当完成程序时引发的事件
		/**
		 *	虚函数。
		 */
		virtual void		OnFinishApp()
					{return;}

		/// 当结束程序时引发的事件
		/**
		 *	虚函数。
		 *  @returns
		 *	返回是否可以结束程序。
		 */
		virtual bool		OnExitApp(bool bisEnforce)
					{return true;}

		/// 当退出程序时引发的事件
		/**
		 *	虚函数。
		 */
		virtual int		OnQuitApp()
					{return 0;}

		/// 当卸载程序时引发的事件
		virtual void		OnDestroyApp() = 0;

	private:
		void			UpdateTimers();
		void			UpdateExactTimers();

	protected:
		bool			m_isCreateWindow;
		/// 程序运行窗口指针
		Window*			m_pMainWindow;
		/// 程序主场景指针
		Scene*			m_pMainScene;
		/// 程序退出标示
		bool			m_isQuitApp;

	private:
		friend class Timer;

		Timer::TimerList	m_lstTimers;
		Timer::TimerList	m_lstExactTimers;
		Timer::TimerList*	GetTimers();
		Timer::TimerList*	GetExactTimers();
	};

	/** @} */

}

#endif
